package com.yuw.streamdemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

import org.junit.jupiter.api.Test;

public class SteamTestDriver {

	/**
	 * 字节流：
	 * 使用输入流读取一个文件内容到cpu中，然后使用输出流将内容写出到指定位置的外部文件中。 （使用输入输出流进行了文件的复制）
	 */
	@Test
	public void test01() {
		try(	// 创建一个输入流对象
				InputStream is = new FileInputStream("D:\\temp\\streamfiles/in01.txt");
				// 输出流对象
				// 构造方法的第二个参数决定写入文件的内容是接着写还是从开头覆盖写； 默认为false，从开头覆盖写；true，从末位接着写
				OutputStream os = new FileOutputStream("D:/temp/streamfiles/in01_out2.txt", true);
			) {
			
			// 用于读取输入流的字节数组
			byte[] b = new byte[1024];
			// 将输入流中的内容读取到用于存储的字节数组中
			int len = is.read(b);
			while (len != -1) {
				// 使用输出流输出内容
				System.out.println(new String(b, "gbk")); // 可以使用String的构造方法指定编码格式
				os.write(b, 0, len);
				// 继续往下读
				len = is.read(b);
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 字符流：
	 * 使用输入流读取一个文件内容到cpu中，然后使用输出流将内容写出到指定位置的外部文件中。 （使用输入输出流进行了文件的复制）
	 */
	@Test
	public void test02() {
		try(	// 创建一个输入流对象
				Reader is = new FileReader("D:\\temp\\streamfiles/in01.txt");
				// 输出流对象
				// 构造方法的第二个参数决定写入文件的内容是接着写还是从开头覆盖写； 默认为false，从开头覆盖写；true，从末位接着写
				Writer os = new FileWriter("D:/temp/streamfiles/in01_out3.txt", true);
			) {
			
			// 用于读取输入流的字节数组
			char[] b = new char[1024];
			// 将输入流中的内容读取到用于存储的字节数组中
			int len = is.read(b);
			while (len != -1) {
				// 使用输出流输出内容
				System.out.println(new String(b)); // 可以使用String的构造方法指定编码格式
				os.write(b, 0, len);
				// 继续往下读
				len = is.read(b);
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 带缓存的字符流流：
	 * 使用输入流读取一个文件内容到cpu中，然后使用输出流将内容写出到指定位置的外部文件中。 （使用输入输出流进行了文件的复制）
	 */
	@Test
	public void test03() {
		try(	// 创建一个输入流对象  设计模式叫做：装饰器模式
				// InputStreamReader 可以将字节流转换为指定编码格式的字符流
				BufferedReader is = new BufferedReader(
							new InputStreamReader(
								new FileInputStream("D:\\temp\\streamfiles/in01.txt"),"utf-8"));
				// 输出流对象
				// 构造方法的第二个参数决定写入文件的内容是接着写还是从开头覆盖写； 默认为false，从开头覆盖写；true，从末位接着写
				BufferedWriter os = new BufferedWriter(
							new OutputStreamWriter(
									new FileOutputStream("D:/temp/streamfiles/in01_out4.txt", true),"utf-8"));
			) {
			// 将输入流中的内容读取到用于存储的字节数组中
			String strLine = is.readLine(); // 读入的内容不包含换行符
			while (strLine != null) {
				// 使用输出流输出内容
				System.out.println(strLine); // 可以使用String的构造方法指定编码格式
				os.write(strLine);
				// 手动追加换行符
				//os.write("\n");
				os.newLine();
				// 继续往下读
				strLine = is.readLine();
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 使用BufferedReader从控制读取内容
	 * 
	 */
	@Test
	public void test04() {
		try(	// 创建一个输入流对象  设计模式叫做：装饰器模式
				// InputStreamReader 可以将字节流转换为指定编码格式的字符流
				BufferedReader is = new BufferedReader(
							new InputStreamReader(System.in));
				
			) {
			System.out.println("请输入一行内容【输入 exit 退出】：");
			// 将输入流中的内容读取到用于存储的字节数组中
			String strLine = is.readLine(); // 读入的内容不包含换行符
			while (!strLine.trim().equalsIgnoreCase("exit")) {
				// 使用输出流输出内容
				System.out.println("您输入的内容："+strLine); // 可以使用String的构造方法指定编码格式				
				// 继续往下读
				System.out.println("请输入一行内容【输入 exit 退出】：");
				strLine = is.readLine();
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
